package moonbox.jdbc;


import moonbox.jdbc.util.Utils;
import moonbox.protocol.protobuf.ExecutionResultPB;

import java.sql.*;

public class MoonboxStatement implements Statement {
  private static final int DEFAULT_QUERY_TIMEOUT = 60 * 60;// 1h
  private static final int DEFAULT_FETCH_SIZE = 1000;
  private static final int DEFAULT_MAX_ROWS = 1000;

  private MoonboxConnection conn;
  private String database;
  private int maxRows;
  private int fetchSize;
  private int queryTimeout;

  MoonboxStatement(MoonboxConnection conn, String database) throws SQLException {
    this.conn = conn;
    this.database = database;
    this.maxRows = Integer.valueOf(this.conn.getClientInfo().getProperty("maxrows", String.valueOf(DEFAULT_MAX_ROWS)));
    this.fetchSize = Integer.valueOf(this.conn.getClientInfo().getProperty("fetchsize", String.valueOf(DEFAULT_FETCH_SIZE)));
    this.queryTimeout = Integer.valueOf(this.conn.getClientInfo().getProperty("querytimeout", String.valueOf(DEFAULT_QUERY_TIMEOUT)));
  }

  @Override
  public ResultSet executeQuery(String sql) throws SQLException {
    ExecutionResultPB execute = conn.getClient().execute(Utils.splitSQLs(sql), maxRows, fetchSize, queryTimeout);
    return new MoonboxResultSet(conn, this, new MoonboxResult(conn, this, execute));
  }

  @Override
  public int executeUpdate(String sql) throws SQLException {
    throw new SQLException("Unsupport operation");
  }

  @Override
  public void close() throws SQLException {

  }

  @Override
  public int getMaxFieldSize() throws SQLException {
    return 0;
  }

  @Override
  public void setMaxFieldSize(int max) throws SQLException {

  }

  @Override
  public int getMaxRows() throws SQLException {
    return this.maxRows;
  }

  @Override
  public void setMaxRows(int max) throws SQLException {
    this.maxRows = max;
  }

  @Override
  public void setEscapeProcessing(boolean enable) throws SQLException {

  }

  @Override
  public int getQueryTimeout() throws SQLException {
    return this.queryTimeout;
  }

  @Override
  public void setQueryTimeout(int seconds) throws SQLException {
    this.queryTimeout = seconds;
  }

  @Override
  public void cancel() throws SQLException {
    conn.getClient().cancel();
  }

  @Override
  public SQLWarning getWarnings() throws SQLException {
    return null;
  }

  @Override
  public void clearWarnings() throws SQLException {

  }

  @Override
  public void setCursorName(String name) throws SQLException {

  }

  @Override
  public boolean execute(String sql) throws SQLException {
    return false;
  }

  @Override
  public ResultSet getResultSet() throws SQLException {
    return null;
  }

  @Override
  public int getUpdateCount() throws SQLException {
    return 0;
  }

  @Override
  public boolean getMoreResults() throws SQLException {
    return false;
  }

  @Override
  public void setFetchDirection(int direction) throws SQLException {

  }

  @Override
  public int getFetchDirection() throws SQLException {
    return 0;
  }

  @Override
  public void setFetchSize(int rows) throws SQLException {
    this.fetchSize = rows;
  }

  @Override
  public int getFetchSize() throws SQLException {
    return this.fetchSize;
  }

  @Override
  public int getResultSetConcurrency() throws SQLException {
    return 0;
  }

  @Override
  public int getResultSetType() throws SQLException {
    return 0;
  }

  @Override
  public void addBatch(String sql) throws SQLException {

  }

  @Override
  public void clearBatch() throws SQLException {

  }

  @Override
  public int[] executeBatch() throws SQLException {
    return new int[0];
  }

  @Override
  public Connection getConnection() throws SQLException {
    return this.conn;
  }

  @Override
  public boolean getMoreResults(int current) throws SQLException {
    return false;
  }

  @Override
  public ResultSet getGeneratedKeys() throws SQLException {
    return null;
  }

  @Override
  public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException {
    return 0;
  }

  @Override
  public int executeUpdate(String sql, int[] columnIndexes) throws SQLException {
    return 0;
  }

  @Override
  public int executeUpdate(String sql, String[] columnNames) throws SQLException {
    return 0;
  }

  @Override
  public boolean execute(String sql, int autoGeneratedKeys) throws SQLException {
    return false;
  }

  @Override
  public boolean execute(String sql, int[] columnIndexes) throws SQLException {
    return false;
  }

  @Override
  public boolean execute(String sql, String[] columnNames) throws SQLException {
    return false;
  }

  @Override
  public int getResultSetHoldability() throws SQLException {
    return 0;
  }

  @Override
  public boolean isClosed() throws SQLException {
    return false;
  }

  @Override
  public void setPoolable(boolean poolable) throws SQLException {

  }

  @Override
  public boolean isPoolable() throws SQLException {
    return false;
  }

  @Override
  public void closeOnCompletion() throws SQLException {

  }

  @Override
  public boolean isCloseOnCompletion() throws SQLException {
    return false;
  }

  @Override
  public <T> T unwrap(Class<T> iface) throws SQLException {
    return null;
  }

  @Override
  public boolean isWrapperFor(Class<?> iface) throws SQLException {
    return false;
  }
}
